DECLARE_WAIT_QUEUE_HEAD(xb_waitq);
+static inline struct ringbuf_head *outbuf(void)
+{
+ return machine_to_virt(xen_start_info.store_mfn << PAGE_SHIFT);
+}
+
+static inline struct ringbuf_head *inbuf(void)
+{
+ return machine_to_virt(xen_start_info.store_mfn << PAGE_SHIFT)
+ + PAGE_SIZE/2;
+}
+
static irqreturn_t wake_waiting(int irq, void *unused, struct pt_regs *regs)
{
wake_up(&xb_waitq);
return avail != 0;
}
-int xb_write(struct ringbuf_head *out, const void *data, unsigned len)
+int xb_write(const void *data, unsigned len)
{
struct ringbuf_head h;
+ struct ringbuf_head *out = outbuf();
do {
void *dst;
return 0;
}
-int xs_input_avail(struct ringbuf_head *in)
+int xs_input_avail(void)
{
unsigned int avail;
+ struct ringbuf_head *in = inbuf();
get_input_chunk(in, in->buf, &avail);
return avail != 0;
}
-int xb_read(struct ringbuf_head *in, void *data, unsigned len)
+int xb_read(void *data, unsigned len)
{
struct ringbuf_head h;
+ struct ringbuf_head *in = inbuf();
int was_full;
while (len != 0) {
unsigned int avail;
const char *src;
- wait_event(xb_waitq, xs_input_avail(in));
+ wait_event(xb_waitq, xs_input_avail());
h = *in;
mb();
if (!check_buffer(&h)) {
}
/* If we left something, wake watch thread to deal with it. */
- if (xs_input_avail(in))
+ if (xs_input_avail())
wake_up(&xb_waitq);
return 0;
}
/* Set up interrpt handler off store event channel. */
-int xb_init_comms(void **in, void **out)
+int xb_init_comms(void)
{
int err, irq;
return err;
}
- *out = machine_to_virt(xen_start_info.store_mfn << PAGE_SHIFT);
- *in = *out + PAGE_SIZE / 2;
-
/* FIXME zero out page -- domain builder should probably do this*/
- memset(*out, 0, PAGE_SIZE);
+ memset(machine_to_virt(xen_start_info.store_mfn << PAGE_SHIFT),
+ 0, PAGE_SIZE);
return 0;
}
#ifndef _XENBUS_COMMS_H
#define _XENBUS_COMMS_H
int xs_init(void);
-int xb_init_comms(void **in, void **out);
+int xb_init_comms(void);
/* Low level routines. */
-struct ringbuf_head;
-int xb_write(struct ringbuf_head *out, const void *data, unsigned len);
-int xb_read(struct ringbuf_head *in, void *data, unsigned len);
-int xs_input_avail(struct ringbuf_head *in);
+int xb_write(const void *data, unsigned len);
+int xb_read(void *data, unsigned len);
+int xs_input_avail(void);
extern wait_queue_head_t xb_waitq;
#endif /* _XENBUS_COMMS_H */
#define streq(a, b) (strcmp((a), (b)) == 0)
static char printf_buffer[4096];
-static void *xs_in, *xs_out;
static LIST_HEAD(watches);
DECLARE_MUTEX(xenbus_lock);
void *ret;
int err;
- err = xb_read(xs_in, &msg, sizeof(msg));
+ err = xb_read(&msg, sizeof(msg));
if (err)
return ERR_PTR(err);
if (!ret)
return ERR_PTR(-ENOMEM);
- err = xb_read(xs_in, ret, msg.len);
+ err = xb_read(ret, msg.len);
if (err) {
kfree(ret);
return ERR_PTR(err);
void xenbus_debug_write(const char *str, unsigned int count)
{
struct xsd_sockmsg msg;
- void *out = machine_to_virt(xen_start_info.store_mfn << PAGE_SHIFT);
msg.type = XS_DEBUG;
msg.len = sizeof("print") + count + 1;
- xb_write(out, &msg, sizeof(msg));
- xb_write(out, "print", sizeof("print"));
- xb_write(out, str, count);
- xb_write(out, "", 1);
+ xb_write(&msg, sizeof(msg));
+ xb_write("print", sizeof("print"));
+ xb_write(str, count);
+ xb_write("", 1);
}
/* Send message to xs, get kmalloc'ed reply. ERR_PTR() on error. */
for (i = 0; i < num_vecs; i++)
msg.len += iovec[i].iov_len;
- err = xb_write(xs_out, &msg, sizeof(msg));
+ err = xb_write(&msg, sizeof(msg));
if (err)
return ERR_PTR(err);
for (i = 0; i < num_vecs; i++) {
- err = xb_write(xs_out, iovec[i].iov_base, iovec[i].iov_len);;
+ err = xb_write(iovec[i].iov_base, iovec[i].iov_len);;
if (err)
return ERR_PTR(err);
}
char *token;
char *node = NULL;
- wait_event(xb_waitq, xs_input_avail(xs_in));
+ wait_event(xb_waitq, xs_input_avail());
/* If this is a spurious wakeup caused by someone
* doing an op, they'll hold the lock and the buffer
* will be empty by the time we get there.
*/
down(&xenbus_lock);
- if (xs_input_avail(xs_in))
+ if (xs_input_avail())
node = xs_read_watch(&token);
if (node && !IS_ERR(node)) {
int err;
struct task_struct *watcher;
- err = xb_init_comms(&xs_in, &xs_out);
+ err = xb_init_comms();
if (err)
return err;